package doing.doing_001_500;

import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 383. Ransom Note 赎金信
 * <p>
 * 题目说明：
 * 为了不暴露赎金信字迹，要从杂志上搜索各个需要的字母，组成单词来表达意思。
 * 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串，
 * 判断第一个字符串ransom能不能由第二个字符串magazines里面的字
 * 符构成。如果可以构成，返回 true ；否则返回 false。
 * <p>
 * 注意：
 * <p>
 * 你可以假设两个字符串均只含有小写字母。
 * <p>
 * canConstruct( "a",   "b") -> false
 * canConstruct("aa",  "ab") -> false
 * canConstruct("aa", "aab") -> true
 */
@SuppressWarnings("all")
public class RansomNote {

    public boolean canConstruct(String ransomNote, String magazine) {
        int r = ransomNote.length();
        int m = magazine.length();

        char[] rs = ransomNote.toCharArray();
        char[] ms = magazine.toCharArray();

        if (r > m) {
            return false;
        }

        int[] tmp = new int[128];

        for (char c : ms) {
            tmp[c]++;
        }

        for (char c : rs) {
            if (--tmp[c] < 0)
                return false;
        }

        return true;
    }

    @Test
    public void test() {
        info(canConstruct("aa", "aab"));
    }
}



















































/*
public boolean canConstruct(String ransomNote, String magazine) {
    int len1 = ransomNote.length();
    int len2 = magazine.length();
    char[] chs1 = ransomNote.toCharArray();
    char[] chs2 = magazine.toCharArray();
    if(len1>len2) return false;
    int[] chs3 = new int[128];
    for(char c : chs2){
        chs3[c]++;
    }
    for(char c : chs1){
        if(--chs3[c]<0) return false;
    }
    return true;
}
*/

